package com.regan.erp.util;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.regan.erp.model.User;

import javax.servlet.http.HttpSession;

/**
 * 用户util
 *
 * @author zhangby
 * @date 2018/9/11 下午4:40
 */
public class UserUtil {

    private static final String SESSION_LOGIN_USER = "login_user";
    private static final String REDIS_USER_ID = "user_id";

    /**
     * 从session里获取用户信息
     *
     * @return
     */
    public static User getUser(HttpSession session) {
        //session 里获取用户信息
        User user = (User) session.getAttribute(SESSION_LOGIN_USER);
        if (user != null) {
            return getUserById(user.getId());
        }
        return null;
    }

    /**
     * 根据用户id获取用户
     *
     * @return
     */
    public static User getUserById(String id) {
        User user = null;
        //获取rediskey，查询redis数据
        String redisKey = StrUtil.format(ConfigUtil.redisKey().get(REDIS_USER_ID),id);
        String user_data = RedisUtil.get(redisKey);
        //验证用户数据是否为空
        if (StrUtil.isBlank(user_data)) {
            //查询数据库
            user = User.dao.findById(id);
            //用户信息预处理
            User.preConsumer.accept(user);
            //放入缓存
            RedisUtil.set(redisKey, user);
        } else {
            //json 数据格式化
            try {
                user = JSON.parseObject(user_data, User.class);
            } catch (Exception e) {
                //查询数据库
                user = User.dao.findById(id);
                //用户信息预处理
                User.preConsumer.accept(user);
                //放入缓存
                RedisUtil.set(redisKey, user);
            }
        }
        return user;
    }

    /**
     * 清空用户信息，此处只清空redis
     * @param id 用户id
     */
    public static void clear(String id) {
        //清空用户信息
        RedisUtil.del(StrUtil.format(ConfigUtil.redisKey().get(REDIS_USER_ID),id));
        //用户角色授权菜单
        AuthUtil.clearUserRoleAuth(id);
    }

    /**
     * 清空用户信息，此处清空 session & redis
     * @param id 用户id
     */
    public static void clearAll(String id,HttpSession session) {
        session.removeAttribute(SESSION_LOGIN_USER);
        clear(id);
    }


    /**
     * 登录成功，添加用户信息到session
     *
     * @author zhangby
     * @date 2018/9/12 上午10:33
     */
    public static void addSession(User user,HttpSession session) {
        session.setAttribute(SESSION_LOGIN_USER,getUserById(user.getId()));
    }

    /**
     * 验证用户是否登录超时
     *
     * @param session
     * @return
     * @author zhangby
     * @date 2018/9/12 上午10:29
     */
    public static Boolean verify(HttpSession session) {
        return ObjectUtil.isNotNull(session.getAttribute(SESSION_LOGIN_USER)) ? true : false;
    }
}
